#!/usr/bin/env python
import os
import glob
import shutil
import argparse


def clean_django_project(root_dir=None, dry_run=False):
    """
    清理 Django 项目中的 sqlite 数据库文件和 migrations 文件夹

    参数:
        root_dir (str): 项目根目录，如果不指定则使用当前目录
        dry_run (bool): 如果为 True，则只显示将要删除的文件而不实际删除
    """
    if root_dir is None:
        root_dir = os.getcwd()

    print(f"正在清理 Django 项目目录: {root_dir}")
    if dry_run:
        print("(干跑模式 - 不会实际删除任何文件)")

    # 查找并删除所有 sqlite 数据库文件
    db_files = glob.glob(os.path.join(
        root_dir, '**/*.sqlite3'), recursive=True)
    db_files += glob.glob(os.path.join(root_dir, '**/*.db'), recursive=True)

    for db_file in db_files:
        if dry_run:
            print(f"[将删除] 数据库文件: {db_file}")
        else:
            print(f"[删除] 数据库文件: {db_file}")
            try:
                os.remove(db_file)
            except Exception as e:
                print(f"错误: 无法删除 {db_file} - {str(e)}")

    # 查找并删除所有 migrations 文件夹中的文件（除了 __init__.py）
    migrations_dirs = glob.glob(os.path.join(
        root_dir, '**/migrations/'), recursive=True)

    for migrations_dir in migrations_dirs:
        if not os.path.isdir(migrations_dir):
            continue

        print(f"\n处理 migrations 目录: {migrations_dir}")

        for item in os.listdir(migrations_dir):
            item_path = os.path.join(migrations_dir, item)

            # 跳过 __init__.py 和 __pycache__
            if item == "__init__.py" or item == "__pycache__":
                continue

            if os.path.isdir(item_path):
                if dry_run:
                    print(f"[将删除] 目录: {item_path}")
                else:
                    print(f"[删除] 目录: {item_path}")
                    try:
                        shutil.rmtree(item_path)
                    except Exception as e:
                        print(f"错误: 无法删除目录 {item_path} - {str(e)}")
            else:
                if dry_run:
                    print(f"[将删除] 文件: {item_path}")
                else:
                    print(f"[删除] 文件: {item_path}")
                    try:
                        os.remove(item_path)
                    except Exception as e:
                        print(f"错误: 无法删除文件 {item_path} - {str(e)}")

    print("\n清理完成!")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description='清理 Django 项目中的 sqlite 数据库文件和 migrations 文件夹')
    parser.add_argument('--root-dir', help='项目根目录 (默认为当前目录)')
    parser.add_argument('--dry-run', action='store_true',
                        help='干跑模式，只显示将要删除的文件而不实际删除')

    args = parser.parse_args()
    clean_django_project(root_dir=args.root_dir, dry_run=args.dry_run)
